const { environment } = require('./environment.js')
import { ACCESS_TOKEN } from '@/store/mutation-types'
import storage from '@/utils/storage';

// 此vm参数为页面的实例，可以通过它引用vuex中的变量
module.exports = (vm) => {
  // 初始化请求配置
  uni.$u.http.setConfig((config) => {
    /* config 为默认全局配置，请求地址判断*/
    /* #ifdef H5 */
    if (process.env.NODE_ENV === 'production') {
      config.baseURL = environment.baseURL; /* 根域名 */
    } else {
      // 开发模式则使用代理方式，见vue.config.js配置
      config.baseURL = '/'; /* 根域名 */
    }
    /* #endif */
    /* #ifndef H5 */
    config.baseURL = environment.baseURL; /* 根域名 */
    /* #endif */
    return config
  })

  // 请求拦截
  uni.$u.http.interceptors.request.use((config) => {
    // 初始化请求拦截器时，data可能为undefined，赋予默认{}
    config.data = config.data || {}

    // 根据 custom.auth 判断是否添加 token
    if (config?.custom?.auth) {
      const token = storage.get(ACCESS_TOKEN)
      if (token) {
        // config.header.Authorization = 'Bearer ' + token
        config.header.Authorization = token;
      }
    }

    // 显示 loading（根据 custom.loading）
    if (config?.custom?.loading) {
      uni.showLoading({
        title: '加载中...',
        mask: true
      })
      uni.hideLoading();
    }

    return config
  }, (config) => {
    uni.hideLoading(); // 确保加载框被隐藏
    // 可在此对请求错误做处理
    return Promise.reject(config)
  })

  // 响应拦截
  uni.$u.http.interceptors.response.use(
    (response) => {
      uni.hideLoading();
      const data = response.data;
      const custom = response.config?.custom;

      if (data.code !== 200) {
        // 默认 toast 提示
        if (custom?.toast !== false) {
          uni.$u.toast(data.msg || '请求失败');
        }

        switch (data.code) {
          case 401: // 未登录或 token 失效
            uni.reLaunch({
              url: '/pages/login/login'
            });
            break;

          case 403: // token 过期
          case 523: // 自定义服务端状态码，表示登录失效
            uni.$u.toast('登录已过期，请重新登录');
            setTimeout(() => {
              uni.reLaunch({
                url: '/pages/login/login'
              });
            }, 1000);
            break;

          case 404:
            uni.$u.toast('请求地址不存在');
            break;

          default:
            break;
        }

        if (custom?.catch) {
          return Promise.reject(data);
        } else {
          return new Promise(() => { });
        }
      }

      return data;
    },
    (error) => {
      uni.showLoading({
        title: '加载中...',
        mask: true
      })

      uni.hideLoading();
      console.error('请求失败:', error);

      // 判断是否是网络错误（如无网络、超时）
      if (!error.statusCode) {
        uni.$u.toast('网络异常，请检查网络连接');
        return Promise.reject(error);
      }

      // 处理 HTTP 状态码错误
      const statusCode = error.statusCode;

      switch (statusCode) {
        case 401:
          uni.reLaunch({
            url: '/'
          });
          break;

        case 403:
        case 523:
          uni.$u.toast('登录已过期，请重新登录');
          setTimeout(() => {
            uni.reLaunch({
              url: '/'
            });
          }, 1000);
          break;

        case 404:
          uni.$u.toast('请求地址不存在');
          break;

        default:
          uni.$u.toast(`服务器异常: ${statusCode}`);
          break;
      }

      return Promise.reject(error);
    }
  );



}